import { ElMessage } from "element-plus";
import { useMenuStore } from "@/store/menu.js";
import router, { getAllRouter } from "@/router";
import type { IStringMap } from "@/types/common";
import type { IMenu } from "@/types/menu";

const permission: IStringMap = {};
export const routerConfig = () => {
  //使用钩子函数对路由进行跳转权限判断
  router.beforeEach(async to => {
    const menuStore = useMenuStore();
    document.title = `${to.meta.title} | xxxx管理系统`;
    /* 判断vuex中是否有菜单权限数据 */
    if (to.name !== "login" && menuStore.menuList.length === 0 && localStorage.getItem("Authorization")) {
      /* 获取菜单以及权限数据 */
      await handleAsyncMemu(menuStore);
    }
    if (!to.meta.permission) return;
    // 没有登录直接跳转到登录页面
    if (!localStorage.getItem("Authorization")) return "/login";
    /* 在此处判断对应登录人是否有对应的路由
      1.获取所有的权限判断是否有该路由 ，没有显示404页面
      2.获取登录人对应的路由，没有权限，显示403页面
    */
    if (!getAllRouter.includes(to.path)) return "/notFound";
    console.log("执行到这里了");
  });
};

/* 所有路由,每次增加新页面的的时候，都想都需要添加对应的路由 */

/* 处理获取目录与菜单 */
function handleGetMemu(items: Array<IMenu>) {
  if (items.length === 0) return;
  items.forEach(item => {
    if (item.icon) {
      /* 需要取第二个图标 */
      item.icon = item.icon.split(";")[1];
    }
    if (item.type === 2) {
      /* 菜单与权限之间的关系,约定w_开头 */
      permission[item.name] = item.items.map(a => a.action) as string[];
      item.items = [];
    } else if (item.type === 1) {
      handleGetMemu(item.items);
    }
  });
}

/* 判断是否有相同的路由，异常提示 */
function isSameRouter(getAllRouter: Array<string>) {
  if (getAllRouter.length !== [...new Set(getAllRouter)].length) {
    throw "路由有重复的,请删除相同的路由";
  }
}
isSameRouter(getAllRouter);

/* 异步获取目录与菜单 */
async function handleAsyncMemu(menuStore: ReturnType<typeof useMenuStore>) {
  try {
    const res = await menuStore.getMyRoleInfo<Array<IMenu>>();
    if (res.status === 1) {
      /* 整理菜单 和 权限 */
      handleGetMemu(res.result);
      menuStore.setMenuListInfo(res.result);
      menuStore.setPermissionInfo(permission);
    } else {
      ElMessage.error(res.msg);
    }
  } catch (error) {
    console.log(error);
  }
}

/* 获取父路由 */
// let parents = roles.filter((role) => role.pid === 0).map((role) => {
//   role.children = [];
//   return role;
// }).sort((a,b)=>b.sort-a.sort);
/* 获取子路由 */
// let childrens = roles.filter((role) => role.pid !== 0).map((role) => {
//   role.children = [];
//   return role;
// }).sort((a,b)=>b.sort-a.sort);

/**
 * 把路由权限数据，改造成树形结构的数据
 * @param {*} parents 父路由
 * @param {*} childrens 子路由
 */
// function dataToTree (parents, childrens) {
//   parents.map((parent) => {
//     childrens.map((child, index) => {
//       if (parent.id === child.pid) {
//         /* 拷贝一份子路由 */
//         let _children = JSON.parse(JSON.stringify(childrens));
//         /* 删除拷贝的子路由中的pid与父路由中的id相等的数据 */
//         _children.splice(index, 1);
//         /* 递归遍历 */
//         dataToTree([child], _children);
//         parent.children.push(child)
//       }
//     })
//   })
// }
